<?php
// 管理兑换码信息
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

/**
 * 验证码/兑换码模型
 * 
 * 该模型用于管理系统中的验证码/兑换码信息
 * 
 * @property int $id 主键ID
 * @property string $code 验证码
 * @property string $card_number 卡号/兑换码号
 * @property int $wechat_user_id 关联的微信用户ID
 * @property int $is_used 使用状态（0未使用，1已使用，3已绑定）
 * @property \Carbon\Carbon $expired_at 过期时间
 * @property int $code_activity_id 关联的活动ID
 * @property decimal $value 面值
 * @property \Carbon\Carbon $created_at 创建时间
 * @property \Carbon\Carbon $updated_at 更新时间
 */
class VerificationCode extends Model
{
    use HasFactory;

    // 定义状态常量
    const STATUS_UNUSED = 0;    // 未使用
    const STATUS_USED = 1;      // 已使用
    const STATUS_BOUND = 3;     // 已绑定

    /**
     * 可批量赋值的属性
     *
     * @var array
     */
    protected $fillable = [
        'code',          // 验证码
        'card_number',   // 卡号/兑换码号
        'wechat_user_id',// 微信用户ID
        'is_used',       // 使用状态
        'expired_at',    // 过期时间
        'code_activity_id', // 活动ID
        'value'         // 面值
    ];

    /**
     * 属性类型转换
     *
     * @var array
     */
    protected $casts = [
        'is_used' => 'integer',    // 确保使用状态为整数类型
        'expired_at' => 'datetime', // 将过期时间转换为日期时间类型
        'value' => 'decimal:2'      // 将面值转换为两位小数的decimal类型
    ];

    /**
     * 获取关联的活动信息
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function codeActivity()
    {
        return $this->belongsTo(CodeActivity::class);
    }

    /**
     * 获取关联的微信用户信息
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function wechatUser()
    {
        return $this->belongsTo(WechatUser::class);
    }

    /**
     * 通过活动获取关联的商品信息
     * 这是一个跨表的关联��系：verification_codes -> code_activities -> products
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasOneThrough
     */
    public function product()
    {
        return $this->hasOneThrough(
            Product::class,         // 最终要关联到的模型
            CodeActivity::class,    // 中间模型
            'id',                   // code_activities.id
            'id',                   // products.id
            'code_activity_id',     // verification_codes.code_activity_id
            'product_id'           // code_activities.product_id
        );
    }

    /**
     * 获取格式化的更新时间
     * 
     * @return string 格式化后的时间字符串
     */
    public function getFormattedUpdatedAtAttribute()
    {
        return $this->updated_at ? $this->updated_at->format('Y-m-d H:i:s') : '-';
    }
}